home *** CD-ROM | disk | FTP | other *** search
/ PC-Blue - MS DOS Public Domain Library / PC-Blue MS-DOS Public Domain Library - NYACC.iso / vol048 / jeldsk.asm < prev    next >
Encoding:
Assembly Source File  |  1987-01-11  |  3.4 KB  |  133 lines

  1.     PAGE    60,132
  2. ; JELDSK - JOHN'S ELECTRONIC DISK DRIVER FOR DOS 2
  3. ; 10/30/83 BY JOHN HENDERSON FOR THE PUBLIC DOMAIN
  4. ;    FINAL DEBUGING BY HAO NGUYEN
  5. CSEG    SEGMENT PARA PUBLIC 'CODE'
  6. JELDSK    PROC   FAR
  7.     ASSUME CS:CSEG, ES:CSEG,DS:CSEG
  8.  
  9. ;    SPECIAL DEVICE HEADER
  10. START   DD      -1        ;POINTER TO NEXT DEVICE        
  11.        DW      2000H         ;BLOCK DEVICE (NON IBM FMAT)
  12.         DW     DEV_STRATEGY     ;POINTER TO DEVICE STRAT
  13.        DW      DEV_INT        ;POINTER TO DEVICE INT. HNDLER        
  14.     DB      1        ;NUMBER OF BLOCK DEVICES
  15.     DB    '       '     ;7 BYTES OF FILLER
  16. ;    BIOS PARAMETER BLOCK
  17. BPB_PTR DW    BPB        ;BIOS PARM BLOCK POINTER ARRAY
  18. BPB    DW    512        ;SECTOR SIZE
  19.     DB      1        ;SECTORS/ALLOCATION UNIT
  20.     DW    1        ;NUMBER OF RESERVED SECTORS                       
  21.     DB      1        ;NUMBER OF FATS
  22.     DW    64        ;NUMBER OF DIRECTORY ENTRIES
  23. SECS    DW    132        ;TOTAL NUMBER OF SECTORS
  24.     DB    0FCH        ;MEDIA DESCRIPTOR
  25.     DW    1        ;NUMBER SECTORS OF FAT
  26.  
  27. FUNTAB    DW    INIT            ;INITIALIZATION
  28.     DW    MEDIA_CHECK     ;MEDIA CHECK (BLOCK ONLY)
  29.       DW    BUILD_BPB       ;BUILD BPB   (BLOCK ONLY) 
  30.       DW    EXIT        ;IOCTL INPUT
  31.       DW    INPUT           ;INPUT (READ)
  32.       DW    EXIT        ;NON_DESTR. INPUT NO WAIT         
  33.       DW    EXIT            ;INPUT STATUS (CHAR. ONLY)
  34.     DW    EXIT        ;INPUT FLUSH  (CHAR. ONLY)
  35.       DW    OUTPUT          ;OUTPUT (WRITE)
  36.       DW    OUTPUT      ;OUTPUT (WRITE) W/VERIFY
  37.       DW    EXIT        ;OUTPUT STATUS (CHAR ONLY)
  38.       DW    EXIT          ;OUTPUT FLUSH   "       "
  39.       DW    EXIT           ;IOCTL OUTPUT FLUSH
  40.  
  41. ;DEVICE PSUEDO INTERRUPT HANDLER
  42. DEV_INT: CLD    ; PRESERVE MACHINE STATE ON ENTRY
  43.     PUSH    DS
  44.     PUSH    AX
  45.     PUSH    CX
  46.     PUSH    DX
  47.     PUSH    DI
  48.     PUSH    SI
  49.     PUSH    ES
  50.     MOV    AL,ES:[BX+2]    ;GET FUNCTION BYTE
  51.     SHL    AL,1        ;GET OFFSET TO TABLE
  52.     CBW
  53.     MOV    DI,OFFSET FUNTAB ;GET ADDRESS OF FUN TAB
  54.     ADD    DI,AX
  55.     MOV    AX,ES:[BX+20]    ;STARTING SEC NO
  56.     MOV    CL,5
  57.     SHL    AX,CL        ;MULTIPLY GET ACT SEC
  58.     MOV    DX,CS        ;GET SEG VIRTUAL DISK
  59.     ADD    DX,14        ;ADD PROGRAM SIZE
  60.     ADD    DX,AX        ;STARTING SEG OFFSET
  61.     XOR    SI,SI        ;IT'S ON PARA BOUND.
  62.     MOV    AX,ES:[BX+18]    ;SECTOR CNT
  63.     MOV    CL,9
  64.     SHL    AX,CL
  65.     JNZ    DO_IT
  66.     DEC    AX        ;MOVE IN FOR 64K
  67. DO_IT:    XCHG    CX,AX        ;MOVE LENGTH TO CX
  68.     MOV    AX,OFFSET BPB    ;FOR BUILD_BPB CALL
  69.     JMP    WORD PTR[DI]    ;GOTO FUNTAB ADR
  70.  
  71. ; INITIALIZATION
  72. INIT:    MOV    ES:BYTE PTR[BX+13],1 ;NUM DISK UNITS
  73.     MOV    ES:[BX+14],SI    ;BREAK OFFSET
  74.     MOV    AX,SECS        ;EL DSK SIZE
  75.     MOV    CL,5
  76.     SHL    AX,CL        ;CONV TO PARAGRAPHS
  77.     MOV    DX,CS
  78.     ADD    DX,14        ;PROGRAM SIZE
  79.     ADD    AX,DX
  80.     MOV    ES:[BX+16],AX    ;BREAK SEG
  81.     MOV    DI,200H        ;EL DSK OFFSET
  82.     MOV    ES,DX        ;EL DSK SEGMENT
  83.     MOV    AL,0FCH        ;SET FIRST SEC FAT
  84.     STOSB
  85.     MOV    AX,0FFFFH
  86.     STOSW
  87.     MOV    CX,8190        ;ZERO REST OF FAT + DIR
  88.     INC    AX
  89.     REP    STOSW
  90.     MOV    AX,OFFSET BPB_PTR
  91.  
  92. ;BUILD BIOS PARM BLOCK
  93. BUILD_BPB: POP    ES
  94.     MOV    ES:[BX+18],AX    ;SAVE PNTER TO BPB
  95.     MOV    ES:[BX+20],CS
  96.     JMP    SHORT EXIT2
  97.  
  98. ;MEDIA CHECK
  99. MEDIA_CHECK:
  100.     MOV    ES:BYTE PTR [BX+14],1    ;NOT CHANGED    
  101.     JMP    SHORT EXIT
  102.  
  103. ; DISK READ
  104. INPUT:    MOV    DI,ES:[BX+14]    ;XFR ADR OFFSET
  105.     MOV    ES,ES:[BX+16]    ;XFR ADR SEGMENT
  106.     JMP    SHORT COPYIT
  107.  
  108. ; DISK WRITE
  109. OUTPUT:    PUSH    DX        ;EL DSK SEGMENT
  110.     MOV    SI,ES:[BX+14]    ;XFR ADR OFFSET
  111.     MOV    DX,ES:[BX+16]    ;XFR ADR SEGMENT
  112.     XOR    DI,DI        ;EL DSK OFFSET
  113.     POP    ES        ;EL DSK SEGMENT
  114. COPYIT:    MOV    DS,DX        ;XFR/EL DSK ADR SEGMENT
  115.     REP    MOVSB        ;DO THE "READ"/"WRITE"
  116.  
  117. ;COMMON EXIT
  118. EXIT:    POP    ES
  119. EXIT2:    OR    ES:WORD PTR[BX+3],100H    ;SET DONE
  120.     POP    SI        ;RESTORE REGISTERS
  121.     POP    DI
  122.     POP    DX    
  123.     POP    CX
  124.     POP    AX
  125.     POP     DS
  126.  
  127. ;DEVICE STRATEGY        ;REALLY A NOP
  128. DEV_STRATEGY: RET
  129.  
  130. JELDSK    ENDP
  131. CSEG    ENDS
  132.     END
  133.